package abd.pr1.Mappers;


import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import javax.sql.DataSource;









import abd.pr1.Models.ComentarioSerie;
import abd.pr1.Models.Serie;
import abd.pr1.Models.Usuario;
import abd.pr1.Models.VotoSerie;

public class SeriesMapper extends AbstractMapper<Serie, Integer> {

	private static final String[] SERIES_KEY_COLUMN_NAMES = new String[] { "id" };
	private static final String[] SERIES_COLUMN_NAMES = new String[] { "id", "nombre", "titular", "sinopsis", "estreno", "finalizacion"};
	private static final String SERIES_TABLE_NAME = "series";
	
	public SeriesMapper(DataSource ds) {
		super(ds);
	}
	
	@Override
	protected String getTableName() {
		return SERIES_TABLE_NAME;
	}

	@Override
	protected String[] getColumnNames() {
		return SERIES_COLUMN_NAMES;
	}

	@Override
	protected Object[] serializeObject(Serie object) {
		return new Object[] { object.getId(),object.getNombre(), object.getTitular(),  object.getSinopsis(),object.getEstreno(),object.getFinalizacion()};
	}

	@Override
	protected String[] getKeyColumnNames() {
		return SERIES_KEY_COLUMN_NAMES;
	}

	@Override
	protected Object[] serializeKey(Integer key) {
		return new Object[] { key };
	}

	@Override
	protected Serie buildObject(ResultSet rs) throws SQLException {
		Integer id = rs.getInt("id");
		String nombre = rs.getString("nombre");
		String titular = rs.getString("titular");
		String sinopsis = rs.getString("sinopsis");
		int estreno = rs.getInt("estreno");
		int finalizacion = rs.getInt("finalizacion");
		return new Serie(id, nombre, titular, sinopsis, estreno, finalizacion);
	}

	@Override
	protected Integer getKey(Serie object) {
		return object.getId();
	}

	@Override
	protected boolean hasAutoincrementKey() {
		return true;
	}

	@Override
	void updateKeys(ResultSet rs, Serie object) throws SQLException {
		Integer id = rs.getInt(1);
		object.setId(id);
	}
	
	public List<Serie> buscarNombreSerie(String nombre){
		nombre = "%"+nombre+"%";
		QueryCondition condicion = new QueryCondition("nombre", Operator.LIKE, nombre);
		return findByConditions(new QueryCondition[] {condicion});
	}
	public Double puntuacionMedia(Serie serie){
		
	 List<VotoSerie> votosSerie = new VotosSeriesMapper(ds).queryByExample(new VotoSerie(null, serie.getId(), null));
	 int votos=0;	
	 for (VotoSerie votoSerie : votosSerie) {
			votos+=votoSerie.getVoto();
		}
	 	if(votosSerie.size()>0){		
	  return (double) (votos/votosSerie.size());
	 	}
	 	return (double) 0;
	}
	public String comentariosSerie(Serie serie){
		List<ComentarioSerie> comentariosSerie = new ComentariosSeriesMapper(ds).queryByExample(new ComentarioSerie(null, null, serie.getId(), null, null));
		String comentariosserie="";
		Collections.sort(comentariosSerie);
		for (ComentarioSerie comentarioSerie : comentariosSerie) {
			SimpleDateFormat fecha= new SimpleDateFormat("dd/MM/yyyy H:mm:ss");
			
			String usuarionombre= new UsuariosMapper(ds).findById(comentarioSerie.getId_usuario()).getNick();
			comentariosserie+="Usuario:"+usuarionombre+"\n";
			comentariosserie+="Fecha:"+fecha.format(comentarioSerie.getFecha())+"\n";
			comentariosserie+="Comentario:\n";
			comentariosserie+=comentarioSerie.getTexto()+"\n";
			comentariosserie+="_____________________________________________________________________\n";
		}
		return comentariosserie;
	}
	
}
